package com.smf.lsc.msrf.dubbo.filter;

import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcException;

import com.alibaba.fastjson.JSONObject;
import com.smf.lsc.security.util.AuthUserUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * c提供者拦截器，被调用前，隐式还原用户信息
 * @author ln
 *
 */
@Slf4j
@SPI
public class ProviderRpcFilter implements Filter {
	
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    	Result result = null;
    	try
    	{
	    	if(RpcContext.getContext().getAttachment(AuthUserUtil.USER_INFO_KEY)!=null && !"".equals(RpcContext.getContext().getAttachment(AuthUserUtil.USER_INFO_KEY)))
	    	{
	    		JSONObject userJson = JSONObject.parseObject(RpcContext.getContext().getAttachment(AuthUserUtil.USER_INFO_KEY));
	    		AuthUserUtil.set(userJson);
	    		log.debug("MSRF-Dubbo Debug Message: 还原用户信息成功");
	    	}
	    	else
	    	{
	    		log.debug("MSRF-Dubbo Debug Message: 被调用前无法还原用户信息【请检查调用方是否传入RpcContext】");
	    	}
	    	result=invoker.invoke(invocation);
    	}
    	catch(Exception ex)
    	{
    		throw ex;
    	}
    	finally
    	{
    		AuthUserUtil.remove();
    	}
        return result;
    }
}